import vnode from './vnode';
/**
 * h函数既是AST抽象语法树的产物，也是vnode的起源
 */

/**
 * 只写三个参数的情况
 * ①字符串
 * ②数组
 * ③h函数
 * @param {*} sel 
 * @param {*} data 
 * @param {*} c 
 */
export default function (sel, data, c) {
  // 检查参数
  if (arguments.length != 3)
    throw new Error('参数必须为三个');
  // 三种情况
  if (typeof c == 'string' || typeof c == 'number') {
    // 字符串
    return vnode(sel, data, undefined, c, undefined);
  } else if (Array.isArray(c)) {
    // 数组
    let children = [];
    for (let i = 0; i < c.length; i++) {
      if (typeof c[i] == 'object' && c[i].hasOwnProperty('sel')) {
        children.push(c[i]);
      } else {
        throw new Error('参数格式不对');
      }
    }
    return vnode(sel, data, children, undefined, undefined);
  } else if (typeof c == 'object' && c.hasOwnProperty('sel')) {
    return vnode(sel, data, [c], undefined, undefined);
  } else {
    throw new Error('参数格式不对')
  }
}